package io.plus.interactive.user_interface;

import io.plus.interactive.AsynchronousSocketChannelContext;

public interface AioListener {

    /**
     * 建链后触发本方法，注：建链不一定成功，需要关注参数isConnected
     *
     * @param asynchronousSocketChannelContext
     * @param isConnected                      是否连接成功,true:表示连接成功，false:表示连接失败
     * @param isReconnect                      是否是重连, true: 表示这是重新连接，false: 表示这是第一次连接
     */
    void onAfterConnected(AsynchronousSocketChannelContext asynchronousSocketChannelContext, boolean isConnected, boolean isReconnect) throws Exception;

    /**
     * 原方法名：onAfterDecoded
     * 解码成功后触发本方法
     */
    void onAfterDecoded(AsynchronousSocketChannelContext asynchronousSocketChannelContext, Packet packet, int packetSize) throws Exception;

    /**
     * 接收到TCP层传过来的数据后
     *
     * @param asynchronousSocketChannelContext
     * @param receivedBytes                    本次接收了多少字节
     * @throws Exception
     */
    void onAfterReceivedBytes(AsynchronousSocketChannelContext asynchronousSocketChannelContext, int receivedBytes) throws Exception;

    /**
     * 消息包发送之后触发本方法
     *
     * @param asynchronousSocketChannelContext
     * @param packet
     * @param isSentSuccess                    true:发送成功，false:发送失败
     */
    void onAfterSent(AsynchronousSocketChannelContext asynchronousSocketChannelContext, Packet packet, boolean isSentSuccess) throws Exception;

    /**
     * 处理一个消息包后
     *
     * @param asynchronousSocketChannelContext
     * @param packet
     * @param cost                             本次处理消息耗时，单位：毫秒
     * @throws Exception
     */
    void onAfterHandled(AsynchronousSocketChannelContext asynchronousSocketChannelContext, Packet packet, long cost) throws Exception;

    /**
     * 连接关闭前触发本方法
     *
     * @param asynchronousSocketChannelContext the channelcontext
     * @param throwable                        the throwable 有可能为空
     * @param remark                           the remark 有可能为空
     */
    void onBeforeClose(AsynchronousSocketChannelContext asynchronousSocketChannelContext, Throwable throwable, String remark, boolean isRemove) throws Exception;

    /**
     * 连接关闭前后触发本方法
     * 警告：走到这个里面时，很多绑定的业务都已经解绑了，所以这个方法一般是空着不实现的
     * @param clientChannelContext the channelcontext
     * @param throwable the throwable 有可能为空
     * @param remark the remark 有可能为空
     * @param isRemove 是否是删除
     */
}
